// 入口文件
const express = require('express');
const path = require('path')
const app = express();
const cors = require('cors');  // 跨域
const expressJwt = require('express-jwt')  // 解析token
const config = require('./src/config')
const bodyParser = require('body-parser')  // 解析客户端的数据

app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())

app.use(cors());  // 跨域问题

// 配置解析表单数据的中间件 -- 只能解析 application/x-www-form-urlencoded 格式的表单数据
app.use(express.urlencoded({ extended: false }));

// 处理出错信息的 处理函数中间件
app.use((req, res, next) => {
  res.cwcl = function (err, code = 1) {
    res.send({
      meta: {
        code,
        msg: err instanceof Error ? err.message : err,
      }
    })
  }
  next();
})

// 解析 token 中间件
app.use(expressJwt({
  secret: config.jwtSecretKey,
  algorithms: ['HS256']
}).unless({
  path: [/^\/api/]
}))


app.get('/', (req, res) => {
  res.send('欢迎来到图书管理服务器！')
})

// 导入并使用 注册/登录 路由模块
const loginRouter = require('./src/routers/login.js')
app.use('/api', loginRouter)

// 导入并使用 用户信息操作 路由模块
const userRouter = require('./src/routers/users');
app.use(userRouter);

// 导入并使用侧边栏数据模块
const sidebarRouter = require('./src/routers/sidebar');
app.use('/side', sidebarRouter)

// 导入并使用 权限管理 路由模块
const permissionRouter = require('./src/routers/permission');
app.use('/permission', permissionRouter)



// 错误级别中间件 -- 捕获错误
app.use((err, req, res, next) => {
  // if (err instanceof joi.ValidationError) return res.cc(err);  // 验证失败的错误
  if (err.name === 'UnauthorizedError') return res.cwcl('token：身份认证失败！' + err);
  // 未知错误
  res.cwcl(err);
})

const port = process.env.port || 5000
app.listen(port, () => {
  console.log('欢迎使用图书管理服务器：localhost:5000');
})